{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Decision Trees: Classification"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Understanding Decision Trees "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.tree import DecisionTreeClassifier, plot_tree, export_text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_umbrella = pd.DataFrame(\n",
    "    {\n",
    "        'Chance of Rainy': [.1, .9, .3, .1,],\n",
    "        'UV Index': [11, 1, 3, 2,],\n",
    "        'Umbrella': [True, True, False, False, ],\n",
    "    }\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Chance of Rainy  UV Index  Umbrella\n",
      "             0.1        11      True\n",
      "             0.9         1      True\n",
      "             0.3         3     False\n",
      "             0.1         2     False\n"
     ]
    }
   ],
   "source": [
    "print(df_umbrella.to_string(index=False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_names = ['Chance of Rainy', 'UV Index']\n",
    "target = 'Umbrella'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "clf = DecisionTreeClassifier(\n",
    "    # criterion='entropy'\n",
    ").fit(\n",
    "    df_umbrella[feature_names], df_umbrella[target]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Displaying the Decision Tree "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:13: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  del sys.path[0]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(figsize=(12, 6));\n",
    "\n",
    "plot_tree(\n",
    "    clf, \n",
    "    filled=False, \n",
    "    feature_names=feature_names, \n",
    "    class_names=['No Umbrella', 'Umbrella'],\n",
    "    impurity=False,\n",
    "    rotate=True,\n",
    "    ax=ax,\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shall I take an umbrella with me?\n",
      "\n",
      "|--- Chance of Rainy <= 0.6\n",
      "|   |--- UV Index <= 7.0\n",
      "|   |   |--- class: False\n",
      "|   |--- UV Index >  7.0\n",
      "|   |   |--- class: True\n",
      "|--- Chance of Rainy >  0.6\n",
      "|   |--- class: True\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('Shall I take an umbrella with me?\\n')\n",
    "print(\n",
    "    export_text(clf, feature_names=feature_names, spacing=3, decimals=1)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Tree to if-else"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Chance of Rainy', 'UV Index']"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[feature_names[f] for f in clf.tree_.feature if f != -2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.5999999940395355, 7.0]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[t for t in clf.tree_.threshold if t != -2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 1,  2, -1, -1, -1])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.tree_.children_left"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# https://stackoverflow.com/questions/20224526/how-to-extract-the-decision-rules-from-scikit-learn-decision-tree\n",
    "def get_code(tree, feature_names):\n",
    "        left      = tree.tree_.children_left\n",
    "        right     = tree.tree_.children_right\n",
    "        threshold = tree.tree_.threshold\n",
    "        features  = [feature_names[i] for i in tree.tree_.feature]\n",
    "        value = tree.tree_.value\n",
    "\n",
    "        def recurse(left, right, threshold, features, node):\n",
    "                if (threshold[node] != -2):\n",
    "                        print( \"if ( \" + features[node] + \" <= \" + str(threshold[node]) + \" ) {\" )\n",
    "                        if left[node] != -1:\n",
    "                                recurse (left, right, threshold, features,left[node])\n",
    "                        print (\"} else {\")\n",
    "                        if right[node] != -1:\n",
    "                                recurse (left, right, threshold, features,right[node])\n",
    "                        print( \"}\")\n",
    "                else:\n",
    "                        print (\"return \" + str(value[node][0][1]))\n",
    "\n",
    "        recurse(left, right, threshold, features, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "if ( Chance of Rainy <= 0.5999999940395355 ) {\n",
      "if ( UV Index <= 7.0 ) {\n",
      "return 0.0\n",
      "} else {\n",
      "return 1.0\n",
      "}\n",
      "} else {\n",
      "return 1.0\n",
      "}\n"
     ]
    }
   ],
   "source": [
    "get_code(clf, feature_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Iris Classification using Decision Trees"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "from sklearn import datasets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Loading Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let's see what methods the dataset provideds\n",
    "dir(iris)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".. _iris_dataset:\n",
      "\n",
      "Iris plants dataset\n",
      "--------------------\n",
      "\n",
      "**Data Set Characteristics:**\n",
      "\n",
      "    :Number of Instances: 150 (50 in each of three classes)\n",
      "    :Number of Attributes: 4 numeric, predictive attributes and the class\n",
      "    :Attribute Information:\n",
      "        - sepal length in cm\n",
      "        - sepal width in cm\n",
      "        - petal length in cm\n",
      "        - petal width in cm\n",
      "        - class:\n",
      "                - Iris-Setosa\n",
      "                - Iris-Versicolour\n",
      "                - Iris-Virginica\n",
      "                \n",
      "    :Summary Statistics:\n",
      "\n",
      "    ============== ==== ==== ======= ===== ====================\n",
      "                    Min  Max   Mean    SD   Class Correlation\n",
      "    ============== ==== ==== ======= ===== ====================\n",
      "    sepal length:   4.3  7.9   5.84   0.83    0.7826\n",
      "    sepal width:    2.0  4.4   3.05   0.43   -0.4194\n",
      "    petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)\n",
      "    petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)\n",
      "    ============== ==== ==== ======= ===== ====================\n",
      "\n",
      "    :Missing Attribute Values: None\n",
      "    :Class Distribution: 33.3% for each of 3 classes.\n",
      "    :Creator: R.A. Fisher\n",
      "    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\n",
      "    :Date: July, 1988\n",
      "\n",
      "The famous Iris database, first used by Sir R.A. Fisher. The dataset is taken\n",
      "from Fisher's paper. Note that it's the same as in R, but not as in the UCI\n",
      "Machine Learning Repository, which has two wrong data points.\n",
      "\n",
      "This is perhaps the best known database to be found in the\n",
      "pattern recognition literature.  Fisher's paper is a classic in the field and\n",
      "is referenced frequently to this day.  (See Duda & Hart, for example.)  The\n",
      "data set contains 3 classes of 50 instances each, where each class refers to a\n",
      "type of iris plant.  One class is linearly separable from the other 2; the\n",
      "latter are NOT linearly separable from each other.\n",
      "\n",
      ".. topic:: References\n",
      "\n",
      "   - Fisher, R.A. \"The use of multiple measurements in taxonomic problems\"\n",
      "     Annual Eugenics, 7, Part II, 179-188 (1936); also in \"Contributions to\n",
      "     Mathematical Statistics\" (John Wiley, NY, 1950).\n",
      "   - Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\n",
      "     (Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.\n",
      "   - Dasarathy, B.V. (1980) \"Nosing Around the Neighborhood: A New System\n",
      "     Structure and Classification Rule for Recognition in Partially Exposed\n",
      "     Environments\".  IEEE Transactions on Pattern Analysis and Machine\n",
      "     Intelligence, Vol. PAMI-2, No. 1, 67-71.\n",
      "   - Gates, G.W. (1972) \"The Reduced Nearest Neighbor Rule\".  IEEE Transactions\n",
      "     on Information Theory, May 1972, 431-433.\n",
      "   - See also: 1988 MLC Proceedings, 54-64.  Cheeseman et al\"s AUTOCLASS II\n",
      "     conceptual clustering system finds 3 classes in the data.\n",
      "   - Many, many more ...\n"
     ]
    }
   ],
   "source": [
    "print(iris.DESCR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['sepal length (cm)',\n",
       " 'sepal width (cm)',\n",
       " 'petal length (cm)',\n",
       " 'petal width (cm)']"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.feature_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['setosa', 'versicolor', 'virginica']"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(iris.target_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5.1, 3.5, 1.4, 0.2],\n",
       "       [4.9, 3. , 1.4, 0.2],\n",
       "       [4.7, 3.2, 1.3, 0.2],\n",
       "       [4.6, 3.1, 1.5, 0.2],\n",
       "       [5. , 3.6, 1.4, 0.2],\n",
       "       [5.4, 3.9, 1.7, 0.4],\n",
       "       [4.6, 3.4, 1.4, 0.3],\n",
       "       [5. , 3.4, 1.5, 0.2]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.data[:8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iris.target[:8]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# It's customary to call a data frame, df\n",
    "df = pd.DataFrame(\n",
    "    iris.data,\n",
    "    columns=iris.feature_names\n",
    ")\n",
    "\n",
    "df['target'] = pd.Series(\n",
    "    iris.target\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['target_names'] = df['target'].apply(lambda y: iris.target_names[y])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>target</th>\n",
       "      <th>target_names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>71</th>\n",
       "      <td>6.1</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.3</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>141</th>\n",
       "      <td>6.9</td>\n",
       "      <td>3.1</td>\n",
       "      <td>5.1</td>\n",
       "      <td>2.3</td>\n",
       "      <td>2</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>6.3</td>\n",
       "      <td>2.9</td>\n",
       "      <td>5.6</td>\n",
       "      <td>1.8</td>\n",
       "      <td>2</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>121</th>\n",
       "      <td>5.6</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.9</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>5.6</td>\n",
       "      <td>3.0</td>\n",
       "      <td>4.1</td>\n",
       "      <td>1.3</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>104</th>\n",
       "      <td>6.5</td>\n",
       "      <td>3.0</td>\n",
       "      <td>5.8</td>\n",
       "      <td>2.2</td>\n",
       "      <td>2</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "71                 6.1               2.8                4.0               1.3   \n",
       "141                6.9               3.1                5.1               2.3   \n",
       "103                6.3               2.9                5.6               1.8   \n",
       "121                5.6               2.8                4.9               2.0   \n",
       "88                 5.6               3.0                4.1               1.3   \n",
       "104                6.5               3.0                5.8               2.2   \n",
       "\n",
       "     target target_names  \n",
       "71        1   versicolor  \n",
       "141       2    virginica  \n",
       "103       2    virginica  \n",
       "121       2    virginica  \n",
       "88        1   versicolor  \n",
       "104       2    virginica  "
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sample(n=6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>target</th>\n",
       "      <th>target_names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>6.1</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.7</td>\n",
       "      <td>1.2</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>5.7</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>7.7</td>\n",
       "      <td>2.6</td>\n",
       "      <td>6.9</td>\n",
       "      <td>2.3</td>\n",
       "      <td>2</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>6.0</td>\n",
       "      <td>2.9</td>\n",
       "      <td>4.5</td>\n",
       "      <td>1.5</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>6.8</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1.4</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.4</td>\n",
       "      <td>0</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "73                 6.1               2.8                4.7               1.2   \n",
       "18                 5.7               3.8                1.7               0.3   \n",
       "118                7.7               2.6                6.9               2.3   \n",
       "78                 6.0               2.9                4.5               1.5   \n",
       "76                 6.8               2.8                4.8               1.4   \n",
       "31                 5.4               3.4                1.5               0.4   \n",
       "\n",
       "     target target_names  \n",
       "73        1   versicolor  \n",
       "18        0       setosa  \n",
       "118       2    virginica  \n",
       "78        1   versicolor  \n",
       "76        1   versicolor  \n",
       "31        0       setosa  "
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sample(n=6, random_state=42) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <th>petal length (cm)</th>\n",
       "      <th>petal width (cm)</th>\n",
       "      <th>target</th>\n",
       "      <th>target_names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>6.1</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.7</td>\n",
       "      <td>1.2</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>5.7</td>\n",
       "      <td>3.8</td>\n",
       "      <td>1.7</td>\n",
       "      <td>0.3</td>\n",
       "      <td>0</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>118</th>\n",
       "      <td>7.7</td>\n",
       "      <td>2.6</td>\n",
       "      <td>6.9</td>\n",
       "      <td>2.3</td>\n",
       "      <td>2</td>\n",
       "      <td>virginica</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>78</th>\n",
       "      <td>6.0</td>\n",
       "      <td>2.9</td>\n",
       "      <td>4.5</td>\n",
       "      <td>1.5</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>6.8</td>\n",
       "      <td>2.8</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1.4</td>\n",
       "      <td>1</td>\n",
       "      <td>versicolor</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>5.4</td>\n",
       "      <td>3.4</td>\n",
       "      <td>1.5</td>\n",
       "      <td>0.4</td>\n",
       "      <td>0</td>\n",
       "      <td>setosa</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \\\n",
       "73                 6.1               2.8                4.7               1.2   \n",
       "18                 5.7               3.8                1.7               0.3   \n",
       "118                7.7               2.6                6.9               2.3   \n",
       "78                 6.0               2.9                4.5               1.5   \n",
       "76                 6.8               2.8                4.8               1.4   \n",
       "31                 5.4               3.4                1.5               0.4   \n",
       "\n",
       "     target target_names  \n",
       "73        1   versicolor  \n",
       "18        0       setosa  \n",
       "118       2    virginica  \n",
       "78        1   versicolor  \n",
       "76        1   versicolor  \n",
       "31        0       setosa  "
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sample(n=6, random_state=42) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot our classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:55: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import cm\n",
    "from matplotlib.colors import ListedColormap, LinearSegmentedColormap\n",
    "\n",
    "fig, axs = plt.subplots(1, 2, figsize=(10, 5));\n",
    "\n",
    "h_label = 'sepal length (cm)'\n",
    "v_label = 'sepal width (cm)'\n",
    "\n",
    "for c in df['target'].value_counts().index.tolist():\n",
    "    df[\n",
    "        df['target'] == c\n",
    "    ].plot(\n",
    "        kind='scatter',\n",
    "        x=h_label,\n",
    "        y=v_label,\n",
    "        color=['r', 'g', 'b'][c],\n",
    "        # marker=['1', '2', '3'][c],\n",
    "        marker=f'${c}$',\n",
    "        s=64,\n",
    "        alpha='0.5',\n",
    "        label=f'Class {c}',\n",
    "        ax=axs[0],\n",
    "    )\n",
    "    \n",
    "axs[0].set_xlim(0, df[h_label].max() + 1)\n",
    "axs[0].set_ylim(0, df[v_label].max() + 1)\n",
    "\n",
    "h_label = 'petal length (cm)'\n",
    "v_label = 'petal width (cm)'\n",
    "\n",
    "for c in df['target'].value_counts().index.tolist():\n",
    "    df[\n",
    "        df['target'] == c\n",
    "    ].plot(\n",
    "        kind='scatter',\n",
    "        x=h_label,\n",
    "        y=v_label,\n",
    "        color=['r', 'g', 'b'][c],\n",
    "        # marker=['1', '2', '3'][c],\n",
    "        marker=f'${c}$',\n",
    "        s=64,\n",
    "        alpha='0.5',\n",
    "        label=f'Class {c}',\n",
    "        ax=axs[1],\n",
    "    )\n",
    "    \n",
    "axs[1].set_xlim(0, df[h_label].max() + 1)\n",
    "axs[1].set_ylim(0, df[v_label].max() + 1)\n",
    "\n",
    "axs[1].axhline(y=0.8, color='black', linestyle='--', alpha=0.75)\n",
    "\n",
    "axs[0].legend()\n",
    "axs[1].legend()\n",
    "    \n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['petal length x width (cm)'] = df['petal length (cm)'] * df['petal width (cm)']\n",
    "df['sepal length x width (cm)'] = df['sepal length (cm)'] * df['sepal width (cm)']\n",
    "\n",
    "df['petal length x sepal length (cm)'] = df['petal length (cm)'] * df['sepal length (cm)']\n",
    "df['petal width x sepal width (cm)'] = df['petal width (cm)'] * df['sepal width (cm)']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:25: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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0uIkEsH8Mpdf3szKlUlmzFCuT6mpgiIiIiIiMoCpU/d159q+3ejuDkZKk9JTFy8RERERkYh27YKbbmpkzBhnzpxMpcOpS6qgiIiIiIhEsHs3XH11E11d8KlP9dDcXOmI6pMqKCIiIiIiA+jshEWLGmlvh/nze5g8Wd274qIcFBERERGRAdx4YyObNiVoacmybFlwCd3amuWkk3orHFn9UQVFRERERGQAY8c6M2ZkAejqsvBnJSOqX6qgiIiIiIgMYO5cDSdcLspBERERERGRqqEKioiIiIiIVA1VUEREREREpGqogiIiIiIiIlVDFRQREREREakaqqCIiIiIiEjVUAVFRERERESqhiooIiIiIiJSNVRBERERERGRqqEKioiIiIiIVA1VUEREREREpGqogiIiIiIiIlVDFRQREREREakaqqCIiIiIiEjVUAVFRERERESqhiooIiIiIiJSNZLlOIiZHQbcBEwGHFjs7lea2U+Ao8PVxgM73P31ebZfB+wEeoGMu88uR9wiIiIiIlJeZamgABngc+7+sJmNAVab2d3u/sG+Fczs20B7kX2c5u7b4g5UREREREQqpywVFHffBGwKn+80syeBacATAGZmwAeAOeWIR0REREREqlPZc1DM7AjgDcCKnMVvBba4e1uBzRz4tZmtNrNPxRuhiIiIiIhUirl7+Q5mNhq4D/imu9+Ws3wh8Iy7f7vAdtPcfaOZHQLcDXza3e/ve7+9vX3vSbS1FarjiIiIiIhINWhtbd37fNy4cZb7XtkqKGaWAn4BLHP37+QsTwIbgTe6+4YI+/kqsMvdr+hblltBqYS2trb9CllKR2UbD5VrfFS28VC5xkdlGw+Va3xUtvGoZLn2r6CUpYtXmGPyI+DJ3MpJ6G3AXwtVTszswDCxHjM7EDgdeCzOeEVEREREpDLKlYNyInAeMMfMHgkf7wjfOwdYkruymU01s7vCl5OBB8zsUWAl8L/u/qsyxS0iIiIiImVUrlG8HgCswHvz8ix7AXhH+HwNcGyc8YmIiIiISHXQTPIiIiIiIlI1VEEREREREZGqoQqKiIiIiIhUDVVQRERERESkaqiCIiIiIiIiVUMVFBERERERqRqqoIiIiIiISNVQBUVERERERKqGKigiIiIiIlI1VEEREREREZGqoQqKiIiIiIhUDVVQRERERESkaqiCIiIiIiIiVUMVFBERERERqRrJSgcgIiIiIjJSrV1rPPhgko4Oo7nZOfnkDEcd5ZUOq6LUgiIiIiIiUiFLlqRYv95IpWDzZmPx4ibWrLFKh1VRakEREREREamQefPStLQ4iQTs3g2XX97MypVJZsxIVzq0ilEFRURERESkQqZO3deda/t2o7sbxo5VFy8REREREamgXbvgppsaGTPGmTMnU+lwKkoVFBERERGRCtq9G66+uomuLvjUp3pobq50RJWlCoqIiIiISIV0dsKiRY20t8P8+T1Mnjyyu3eBclBERERERCrmxhsb2bQpQUtLlmXLgkvz1tYsJ53UW+HIKkcVFBERERGRChk71pkxIwtAV5eFPysZUeWpgiIiIiIiUiFz547c4YQLUQ6KiIiIiIhUDVVQRERERESkaqiLVy1wJ7F6NclVq/CmJjJnnIFPmVLpqERERERESk4tKDUgsXw5jbfcAtksic2babzqKmhvr3RYIiIiIiIlV5YKipkdZmb3mtkTZva4mX0mXP5VM9toZo+Ej3cU2P4MM3vKzJ4xs0vKEXM1Sa5YQXb6dHrmz6f7gguwbJbkffdVOiwRERERkZIrVxevDPA5d3/YzMYAq83s7vC977r7FYU2NLMG4AfA3wMbgD+a2R3u/kTsUVcDd6yjg2xrK5jBuHFkJ04k8eKLlY5MRERERKTkytKC4u6b3P3h8PlO4ElgWsTN3ww84+5r3L0HuBU4K55Iq1A6DZkMnkrtW5ZKQXd35WISEREREYlJ0QqKmU00s4vN7B4z22Zm6fDnPWb2z2Y2abAHNLMjgDcAK8JFF5rZn83sOjM7KM8m04Dnc15vIHrlpvalUpBMYumcMbLTaWhqqlxMIiIiIiIxMXfP/4bZ5cBc4C7gPoJWj53AGODVwCnAO4Cb3T1SXoiZjQ739U13v83MJgPbAAe+Dkxx94/12+Z9wBnu/onw9XnA8e5+Yd867e3te0+ira0tSig1ZfINN4AZWz78YRK7djHtmmvoOO442ufMqXRoIiIiIiKD1trauvf5uHHjLPe9YjkoG4CZ7p6vL9GfgFvMrBn4RJQgzCwF/IygQnMbgLtvyXn/h8Av8my6ETgs5/Wh4bK8ck+2XNra2mI9buJd76Jx6VIm/uY3WHs7TJhA8znncMi4cbEds1rEXbYjlco1PirbeKhc46OyjYfKNT4q23hUU7kWrKC4+/cH2tjd9wADrmdmBvwIeNLdv5OzfIq7bwpfvgd4LM/mfwRazexIgorJOcC5Ax2znmRPOIGeVIrkqlVkW1rIzJsHI6ByIiIiIiIjT+RRvMxsOnAsMDp3ubvfEmHzE4HzgL+Y2SPhsi8CHzKz1xN08VoHnB8eaypwrbu/w90zZnYhsAxoAK5z98ejxl0XzMjOnk3P7NmVjkREREREJFaRKihm9q/AV4AngK6ctxwYsILi7g8Aluetuwqs/wJBfkvf67sKrSsiIiIiIvUjagvK54DZI2buERERERERqYio86C8RNAFS0REREREJDZRW1A+Cyw2s+8BW3PfcPf1JY9KRERERERGpKgVlEbgdF45epYTJK6LiIiIiIgMW9QuXlcTjLo1FkjlPBpjiktEREREREagqC0oSeB6d++NMxgRERERERnZoragXAFcEk64KCIiIiIiEouoLSgXAS3AF83spdw33P3wkkclIiIiIiIjUtQKyj/GGoWIiIiIiAgRKyjufl/cgYiIiIiIiETKQTGz28zsrf2WvdXM/ieesEREREREZCSKmiR/CvBgv2UPAaeVNhwRERERERnJolZQ9gAH9ls2GkiXNhwRERERERnJolZQlgHXmNlYgPDn94FfxRWYiIiIiIiMPFErKJ8jmEX+ZTPbCrwMjAM+G1dgIiIiIiIy8kQdxWs78E4zawEOA553982xRiYiIiIiIiNOwQqKmTW5e3fusrBSsnmg9URERERERIaiWAvKI2Z2PfBjd3+h/5tmNgU4D5gHvCae8OqIO4nVq0muWoU3NZE54wx8ypRKRyUiIiIiUlWKVVDeClwCPGpm24GngJ3AGGAWMB64ATg55hjrQmL5chp/+lO8uZmGp58m+fOfs+db38KPPrrSoYmIiIjUhLVrjTvvPJgDDmikudk5+eQMRx3llQ5LSqxgkry7b3P3fwamAR8Hfgk8BtwFfAw41N2/4O7byhJpjUuuWIGbYd3d9L7lLSR27eKASy+F9vZKhyYiIlIxa9caN9+cYuHCRq6/PsWzz1qlQ5IqtmRJik2bGkmlYPNmY/HiJtas0Xem3gyYJO/uPcDvw4cMhTvW0UHi5ZfpfcMb6LnoIujsJLliBcn77iNz5pmVjlBERKQilixJYQaTJu274Dz//G5mzNBdcXmlefPS7Ny5iaOPHs3u3XD55c2sXJlkxgxNzVdPIo3iJcOUTgeP7m78kEPADMaMwQ84gMSLL1Y6OhERkYqZNy9NS4uTSKALThnQ1KlOW1vwfPt2o7sbxo5VZbbeqIJSDqkUJBKQTuOpVLAsnYbGRujWAGgiIjJyTZ267+JSF5wS1a5dcNNNjYwZ48yZk6l0OFJiqqCUgxk+fjzW3Y319EB7O4lt26C5GZqaKh2diIhIxemCU/qsXWs8+GCSjg7Lmwjf1ZXg6qub6OqCCy/sobm5gsFKLKLOJC/DlDnhhCDv5PbbafrBD/B0Gh87luykSZUOTUREpKJ272bvBeenPqULzpFuyZIU69db3kT4zk5YsuQQ2tth/vweJk9Wa1s9itSCYmaNBPOdvB4Ynfueu3+49GHVn+wJJ9Bz3nk0LVkCTz9Ndto0PJslc8oplQ5NRESkYjo7YdGiRtrbYcECXXBK8bykG29s5MUXU7zqVc6yZcFlbGtrlpNO6q1w1FJKUbt43QgcC9wJbIkvnDpmRuYjHyH72tfuN1kj48ZVOjIREZGKufHGRjZtStDSktUFpwDF85LGjnUOO6ybUaOgqytoVenqqkiYEqOoFZQzgCPdfcdQDmJmhwE3AZMBBxa7+5Vm9i3g/wA9wLPAR/Mdw8zWEUwS2Qtk3H32UOKoODOys2fTM7s2wxcRESm1sWOdGTOygC44ZX/58pLmzk3T1raV1lbd4K1nUSso64HhZHNngM+5+8NmNgZYbWZ3A3cD/+ruGTP7D+BfgS8U2MdpmhRSRESkvsydq+GE5ZVy85KUCD/yFKygmNmcnJc3Abeb2ZX06+Ll7r8d6CDuvgnYFD7faWZPAtPc/dc5qy0H3jeI2EVERpQNOzfw0IaHeLn7ZRIk+OTrP1npkERESk55SVKsBeVHeZZd1u+1AzMGc0AzOwJ4A7Ci31sfA35SYDMHfm1mDlzj7osHc0wRkXqwfONynnjpCXq9l2RCo8SLSH1SXpKYe/lqpWY2GrgP+Ka735az/EvAbOBszxOQmU1z941mdghBt7BPu/v9fe+3t7fv3aatb3pREZE6k86mabAG7nz+TjZ0bmDBqxZUOiQRkZK7884J7Ny5/02Y6dP3cOKJHRWKSOLQ2tq69/m4ceMs972owwzf7u5n5Vl+m7ufHXEfKeBnwM39KifzgHcBf5evcgLg7hvDn1vN7OfAm4H7862be7Ll0tbWVpHjjgQq23ioXONTjrJd0bOCzvbOEfUZ6jsbH5VtPFSuQ3fxxfmWjiMYa0llG5dqKteofQROK7D81Cgbm5kRdBl70t2/k7P8DOBfgFPcvbPAtgcCiTB35UDgdOBrEeMWERERKYvcGdA7OibyvvfZfjOg14KBZnGvBfVwDiNd0QqKmfVVBBpznveZATwX8TgnAucBfzGzR8JlXwSuIhgd7O6gDsNyd/8nM5sKXOvu7yCoLv88fD8J3OLuv4p4XBEREZGyWLIkhRlMmgTbtqVYvLiJ88/vZsaM2rk4zj2HvlncdQ5SbgO1oBwW/kzkPIcgaaDBwvQAACAASURBVP154KtRDuLuDwCW5627Cqz/AvCO8PkagkkiRURERKpW7gzof/7zFpYunbh3BvRaUWwW91pRD+cw0hWtoLj7RwHM7EF3/2F5QhIRkXzW7ljLPevuYdPuTWSyGa579DqmjZnG22e8vdKhiQj7z4De3t6w3wzotaLYLO61oh7OYaQrNg9K7vDB9/R7vVfYwiEiIjFLZ9N0Zjo5+ICDAdjTu4c9vXsqHJWI9LdrF9x++0TGjds3A3qtyTeLe62ph3MYqYq1oDxD0JXLwp99+r9uiCEuERHpZ9aEWcyaMKvSYYhIEX0zoO/Z08nnP1+bM6CXchb3SiWsayb62pYo9Ia7J9y9wd0TwCeAW4FXAc3hz1uAj5clypHGncSqVTQuWkTq+uuxTZsqHZGIiIgMIHcG9A99aEtNzoCeew7z5w9/FvclS1KsX2+kUvsS1tesyZeWXDqlPgcpv6jDDH8daHX3rvB1m5mdDzwN3BBHYCNZYvlyGpcuJTtzJonNm2m86iq6L7kExo2rdGgiIlJCGg61vuTOgP7AA+N5+ulUzc2AXupZ3CuRsK6Z6GtfwRaUPOsd0W/ZdNS9KxbJFSvITp9Oz/z5dF9wAZbNkrzvvkqHJSIiJVaJu8sSn7FjnRkzsowaBXv2JOjqMrq6Bt6umuSeQxD/wOewdq1x880pFi5s5PrrUzz77L7v8NSpQeUEypewPpRzkOoStQXlu8Bvzex6guGFDwPmhcullNyxjg6yra1gBuPGkZ04kcSLL1Y6MhERKTENh1pf5s7d97m1tW2ltbX2ej7knkNUUeYdKWfC+lDOQapLpAqKu3/LzP4CvB94A7AJ+JgmTIxBOg2ZDJ5K7VuWSkF3d+ViEhEJbdi5gYc2PMTL3S+TIMEnX//JSodU0zQcavyG241O3fAGNm9emq4uWL48yahRxsqVCX7xixQXXdQDKGFdBi9qCwphZUQVkqjcSaxeTXLVKrypicwZZ+BTpgy8XSoFySSWzqn9p9MwZkx8sYqIRLR843KeeOkJer2XZCLyvxAZgIZDjc9wZxXXrOQDmzrVueyyRswgmYSODuMPf2jgXe8yWlp8b8L6ggVKWJdois2D8iV3/2b4/GuF1nP3S+MIrNYNOdHdDB87Ftu6Fdyho4PEtm1kjj66PIGLiBRxZuuZnH302fz48R+zrn1dpcOpC7q7HK/hdqOrRDe8Wmy1mTcvzejRzve/38Rb3pIhkzFWrkyyfbspYV0GrViS/KE5zw8r8Dg0z3bC8BLdM8cfT+K552hcuJCmq6/GEwkyp5wSc8QiIgNrbGgkYVHHV5GBaDjU+A03SbsSSd61OHjCuHHOokVBRfu9703T2xuUkxLWZSgKtqC4+/yc5x8tTzh1YpiJ7tkTTqAnlSK5ahXZlhYy8+ZpiGERkTqk4VDj19ca8eKLwc9DD+0dUje6cnbDq7XBE3Ir2vPm9bB06b5yUougDEWkDsRm9h3gd8Dv3X17rBHVg+EmupuRfeMbyQDJVatI/upX++ewDDW/RUREqkrf3WUI7i4HPysZUf1ZsiRFOg1PPJFk+3Y45BDjhRdsUDkk5e6GN3Wq761YPf+88ac/JTjyyOqttPZVtCdMyHLppc3s2WN89KPdqpzIkEVtp98FfA7YaGaPmtlVZvZeM5sUY2y1q1Cie1NT5F0kli+n8ZZbIJvdm8NCe/uA74mISO2YOzfNBRf07Pf4+7+v3gvRWvTBD6YZNQpmzuxl4cIuDjoIVq6MPsBDpbrhLVmS4plnjFWrGshk4PHHG6q2m9fYsc6hh2b505+CvJk3vznDAQdUOiqpZZEqKO5+qbufAhwEXAR0AdcBm2OMrXb1T3RvbyexbRvZSdHrc8VyWDSRo4hUytoda7n2kWt5rv05MtkM1z16HcvWLKt0WCIF/frXKbZsSXDQQc4dd6T4058SbNgQ/UK/r3XgoIOcZcuSXH99igceiH+e6g98IE1zs/HqV2dZuLCLUaMGV7Eqp7lz0zQ1wfTpWU47LUNLi7NhQ6Is5ST1KWoXr9HAicApwKnA4cAyQFfFBWSOP57GpUtpXLgQa28fXKJ7sRwWTeQoIhWUzqbpzHRy8AEHA7Cndw97evdUOCqRwvq60XV3w/33J0km4dWvjt5KVYlueJ2dcPvtKTo6gqF5s1mqfo4cdVeUUopaFd8OrAOuIpig8a+xRVQnhpXoXiyHRRM5itScap3ccChxzZowi1kTZpVsf1K9anGo23zmzk2zezf84AdNvPa1vVx44eC6aVViVvLcwRNuvz3JvfemGD8+W9Vz5LzlLZm6+L6USr38/lRK1ArKV4GTgS8C7zKz+whaT1a6e3UOKVFpZmRnz6Zn9uzBb1tsskZN5ChSc6p1csNSx1Wt5ylDUy8TFObmkBSbKLCaLihzW33uuSdFdze8733pqk46r5fvS6moPIYn0n+QcMLGb5pZA3Ac8B7gLqABGB1feCNUsckaNZGjSM2p1skNSx1XtZ6nDE2tDXVbSNShnKvpgnLu3DSdnbBwYSNHH93LggU9TJ1a3Re29fJ9KRWVx/BEzUGZQJB/cgpwGnA0sBrloMSmWA7LsPJbRKTsGhsaKx1CXqWOq1rPU4Ym94K4XBMUxiFqbkS1XVDW2hw59fJ9KRWVx/BEbYPfAKwE7gcuBh50d6U+xahYDosmchQRkXIp5wSFcYiaQ1JtF5S1mnRe69+XUlN5DE3UCspB7q4s7HIqlsMynPwWEalLSlCXOJR7gsJqEPcFZdRcl0ok5w/XSPy+FKPyGLqoOSiqnIiIVLFSJ6irwiNRk8vrQV+l4cUXjRUrGpg4McuXvxzPBWU15bqU0kj6vkSh8hgeDbMiIhKztTvWcs+6e9i0e9PeyQ2njZnG22e8vWTHGEqCerG4hlLhKcd5SvnUWg7EcCxZkiKdhiefTPLSSzBhgrF7dzzHqrZcl1IZSd+XKFQewxNpJnkRERm63MkNWw5siWVyw8aGRhI2uD/pxeI6s/VMvnLiV5h50MyS7E9qT18OxKhRQQ5E8Kh0VPGYNy/NpElw6KHBTOgvvJDgiiuaYpkJferUoHIC1ZHrUioj6fsShcpjeNSCIiISs2KTG1ZSsbiGMiJXtZ6nDE0t5kAM1dSpzrhxwQXljh1BMnoiEW9Ser0lT4+k70sUKo/hiTrM8LXARe7embNsCnC9u58RV3AiIiJxUI6N9Dd3bppdu+Cqq5o48cRePv/57kHloPRPfj/88CZaW/Ovq+RpkeKitqCMBv5sZue5+0Nmdg7wX8C18YUmIiISD816L/0Nt9LQP/l9+fJDOPJIe0Xyu5KnpVKijiBXDaKO4nWOmc0Fbjezp4ApwHvc/YEo25vZYcBNwGTAgcXufmU4AeRPgCOAdcAH3H17nu0/Anw5fPkNd78xynGrkjuJ1atJrlqFNzWROeMMfMqUSkclIjVOCeqDo1nvJVcpKg39k9+/8IVs3uR3JU9LpdTSCHKDuW20EdgDzACeAJ4ZxLYZ4HPu/rCZjQFWm9ndwDzgHne/3MwuAS4BvpC7YViJ+TdgNkHlZrWZ3ZGvIlMLEsuX07h0KdmZM0ls3kzjVVfRfcklmmhRRIYlN0EdGHaCer1XeDTrveQqRaWh/0SPPT2JvMnvtToBo9S+WhpBLmoOyhXAPwLzgV8AlxF0+Vrg7ksH2t7dNwGbwuc7zexJYBpwFnBquNqNwO/oV0EB3g7c7e4vh7HcDZwBLIkSe7VJrlhBdvp0eubPh44Omi+7jOR995E588xKhyYiNazUCeqlrvBIZdVS145KKGWloS/5/cADd+VNflfytFRK/0p0NY8gF7UF5dXAse6+JXz9eTO7k6BSMWAFJZeZHQG8AVgBTA4rLwCbCbqA9TcNeD7n9YZwWe1xxzo6yLa2ghmMG0d24kQSL75Y6chEJEa1mJCtEbnqSy117aiEUlUacvNYPvCBrTQ3H1mS/YqUUi2MIBc1B+WdeZbdb2avG8zBzGw08DPgs+7eYWa5+3MzG/Zfyra2tuHuIrbjWjrN1K1b6Zwwge3h+pPb2/HOTrZWKO5aUKnPtN6pXOPTv2yXbVxGW0cbWbI0WANtB6rshyKO7+zWLVt5ufPluv99OOWUFBMnpsOhcxMsXjyFO+7o4p3vfBnQ34NS6OoyliyZTEdHF+eeu5mJEzMq1xipbIemqyvBzTdPZvfuTubO3cLzz+9fQSlnubYWGuaOYc6D4u47o65rZimCysnN7n5buHiLmU1x903hsMVb82y6kX3dwAAOJegKllexk41LW1tbtOO60zRpEuM7Oph6zz14UxOWSMChhzKuAnHXgshlK4Oico1PvrKdPmM6yURyb0K2yn7wSv2d7cux6WruYmzjWH7f+fu6yrHpL7foNmwwRo1qYtasDK2tB+vvQYksXNhIOp3gyCOzPP30WB54YCsnnjhRye8x0Hd2aDo7g+9pMml88Ys9TJ26fwtfNZVrWWaSt6Cp5EfAk+7+nZy37gA+Ej7/CHB7ns2XAaeb2UFmdhBweris9pjBjh2kfvtb6O0l8dxzpH77W7IHHljpyEQkRkOZ5V3iNVJnva+Frh21qv/M4Xv2JJT8LlWlbzCIgw5yli1Lcv31KR54oKHSYeVVrsHfTwTOA/5iZo+Ey74IXA781Mw+DjwHfADAzGYD/+Tun3D3l83s68Afw+2+1pcwX6v29mNzDyotIiJSViMtx2btWuPee5PcdVeK3l645JI9JZkcUMn3+/TPY2lr20pra2VG6NTnIvnU0ghyZamghPOlFLoS/7s8668CPpHz+jrguniiKyN3GD+ezJw50NBA9ogjyMyZQ2L37kpHJiIidezGG1OsXp3EDF772gy33dbIpEnDT5JX8n110uci+dTSCHKRKyhmdjrweoJZ5fdy90tLHVTdSqeht5fsMceQPeIIkqtWkXj2WXoPOCB4fyiTOGriRxERGUBzM8yalWXKlCxjxji/+lWCH/84xaWX9gxrv7U0r8JIos9Fal2kTtFm9n3gx8AbgcNyHofGF1odSqUgmSTx5JM03nILZLNYezsNf/gDtLcHkziGy/smcaS9veguh7KNiJTX2h1rufaRa3mu/bm9kx4uW1ObqXRSmw47zDnqqCA/4qWXjK4uSCaH38V46tTgIhiqf16FkUSfi9S6qC0o5xLMg/L8gGtKce3tpH7/e7KtraTPP59EWxu2YQPJ++4jsWbNoCdx1MSPItVPkx5KpfV17di1C666qokTT+zl4ou7S7Z/Jd9XJ30uUquiVlC2ATviDGQkSCxfTuKFF7CdO0msWcMBCxbQ+7rXkX3d60hs3Tr4SRw18aNIVcidiHHbi9v4UuuX9nt/pCVkS3XKnUTwwgt7SpIkH+d+ZXj0uUgtK1hBMbMZOS+/DdxsZv8ObMldz93XxBRb3UmuWEHvG9+Ijx4dDDP84ov0Hnssie3bg2EUMhk8ldq3QSoF3UXucKXTg99GREpu+cblPPHSE/R6Lx17OiodjsgrdHbCokWNtLfDggU9TJ5cmu4+ce1Xhkefi9S6Yi0ozxCMiJvbSfVd/dZxoDoHUK42fa0dM2finZ1kW1vJbthAIpMJKhqjR0MyiaVzEtjSaRgzpvA+w5yWQW0jIiV3ZuuZnH302fz48R/z8I6Hy3783BacBAk++fpPlj0GqW598x+0tGRZtiz419/amh32JIJx7VeGR5+L1LqCFRR316xipdTX2tHYiI8di23dCskk7NhBYts2MkcfTWLXrmC5O3R07F1ekNm+fUXdRkRKrrGhsaLHz23BSSbKNb2V1JK45j+opXkVRhJ9LlLrIv0nM7Or3P2iPMu/5+6fLX1YdSintSNz/PE0Ll2KrV+PmdE7cyaZU04hMWkSjUuX0rhwIdbejicSZE45pehQwn37esU2IjJi5LbgrGtfV+lwalq9tkbFNf9BLc2rMJLoc5FaF7WVZF6B5eeVKI76l9PakT3+eHrOOgvr7CQ7bRo9F10UJLifcAI9554LiQTZlpa9y4sNJVxoGxEZORobGkmYGr1Loa81auPOjWzavanS4YiIjEhFW1DM7GN96+U87zODYHQviWhva8eiRVh7O73HHkv3JZfsq1CYkZ09m57Zs/fbruhQwgW2ERGRwVNrlIhI5Q3UxauvhaSR/VtLnGA0r4/EEVS9yp5wAj2pFMlVq8i2tJCZN2/g1g4NJSxS9dbuWMs96+5h0+5N9Hov1z16HdPGTOPtM95e6dBkkCqdTyQiIgNUUNz9NAAz+4a7f7k8IdWxobR2aChhkaqXOxFjtimriRhFRESGIepwL5eavbKDs7tnSxyP9KehhEViVYqk6NyJGNva2mhtbS11mEXltuBkshm14IiISE2LWkHJEHTr2o+ZZYAXgNuAf3P3XSWMTUBDCYvErB6G6M1twQHUgiMiIjUt6n/jTwPvBi4HngcOB/4F+F/gKeDfgO8Bn4ghxhFPQwmLxKcekqJzW3BkeNQaJSJSeVErKBcDx7l7e/j6aTNbBax296PM7C/A6lgirFdF5jbpL3v88WSefZbUsmV4czM9CxZoKGGRElFStORSa5SISOVFraCMBUYB7TnLRgF9V8mbgQNKGFfdSyxfTuPSpWRnztw7t8l+Qw7nrrtiBcmHH6b3b/8Wa28n9ZOf0H3kkaqkiNSpep0ssBYM1Bq1dq3x4INJOjqM5mbn5JMzHHXUK3pA15x6PS8RqU1RZ/a6CbjbzD5pZmeY2SeAZcCN4funE3T1koG4k1i1iqYrr8S2biX97nfTfcEFWDZL8r778m6SOw/KQOuKSO0r9WSBG3ZuYOmTS7nmkWv44SM/LEGEI9eSJSnWrzdSKdi82Vi8uIk1a6zSYQ1bvZ6XiNSmqC0onwfagHOAqcAm4AdA33+6e4HflTq4etTXckJXF3bggTT+13/Rfcklhec20TwoIiNOqfNi6mEggGoxb16alhYnkYDdu+Hyy5tZuTLJjBnpgTeuYvV6XiJSmyL9pwqHE14UPvK9rw66ESVXrCA7bRp24IH0traSfPzxoDWk0NwmmgdFJFbVmBRd6ryYehgIoFpMnbqv29P27UZ3N4wdW/tdoer1vESkNkW+lWZmpwOvB0bnLnf3S0sdVN3KZkk89VQwp8mOHfjUqftaQwrNbaJ5UERitaFjAw+98BDdvd0YRsuBLXWXFK2BAKKLmouxaxfcdFMjY8Y4c+ZkKhBpPOr1vESktkSqoJjZ94EPEHTl6sx5S7dXBiHxwAM0/OUvZI85BkunSd5+O5lTT4UdOwrPbaJ5UERitaVzC4ePPXxv96cLjrug0iFJBS1ZksIMJk3al4tx/vndzJix79/d7t1w9dVNdHXBhRf20NxcwYBLqF7Pq1TiHkhAAxWI7BO1BeVc4Fh3fz7OYOpdctUqvKEBenvJHH00jffeS+quu8hOnoyPGUPi2WdJXX/9K4Yc1jwoIvFR9yfJNVAuRmcnLFrUSHs7LFjQw+TJ9XEBWa/nVUpRKq/VvH+RWhK1grIN2BFnIHXPncRTT5Fob6d3507syCPJAon2dnzatKArV1NT3iGHsyecQE8qRXLVKrItLWTmzdMQwyIlUo3dn6oxL2akGCgX48YbG9m0KUFLS5Zly4J/oa2tWU46qbfssZZSvZ5XKcU9kIAGKhDZJ2oF5dvAzWb278CW3DfcfU3Jo6pH6TSJ558nO306Pm0a3txMorMTHz2a7LHHwgEH0DN/PnR00HzZZSTvu4/MmWcG25qRnT2bntmzK3sOIlJSheY7KTRZ4FDnR1GFZ/AK5WKMHevMmJEFoKvLwp/R9lnNXXiGc14jRdwDCWigApF9olZQFoY/39VvuQMNpQunTuSbJX7yZOjpwceNI9vcTMNjj+GpFNkjj8R6eshOn65hhEVGmELD/xaaLPB//vo/QxouuNKzo1fzhXk+xXIx5s4d+t3sau7CM5zzGmniHkhAAxWIRB9mOOqEjkKBWeI/9znYs4eGv/6V3pNOItvYSMODD+IHHKBhhEVGqMHmvww1X2ag2dHjVs0X5v3FmYuhLjy1L+6BBDRQgUhgUDN2mdlhwDR3Xz7I7a4jaH3Z6u6vDZf9BOgbimo8sMPdX59n23XATqAXyLh71fdzyp35fW+XrQcfDFpIPPxn5x48mpqwF18ktWwZtnMnmTPOKP0wwvladHKS8EVGskp2fxps/ks15stEUUsX5nHmYqgLT22LeyABDVQgsk/UYYYPB5YQzIPiwGgzex9whrt/IsIubgC+D9zUt8DdP5iz/28D7UW2P83dt0WJteIKzfy+dSuMG0fvhAmQSAQjd7W0YOEQw9mJE0ls2kTjt76FZbMlHUY4b4tOThK+yEhW6e5PI0EtXZiXIxdDXXhqU9wDCWigApF9oragXAP8L/BW4KVw2d0EyfMDcvf7zeyIfO+ZmRHMsTInYizVrdDM711dZCdPxrZtC1o02tuD7l09PWT+5m8wwJuaSD36KL0TJ5Z0GOG8LTq5SfgiI1iluz+VylAT6MupFi7M3/KWTKz5MurCU7virrxqoAKRfaJWUN4MvNPds2bmAO7ebmaluAX/VmCLu7cVeN+BX4fHvcbdF5fgmPEpNPP76NH44YeTnTED27iRxAsv4KNGYd3dZN/0JnpnzQqGET7kELJvelPpWjcKtegoCV+krhRKuK8WtXJhHme+TDV34am1gQwqIe6BBDRQgcg+5j7wHyAzewJ4t7s/bWYvu/sEM3sNcKu7vy7SgYIWlF/05aDkLF8IPOPueVtjzGyau280s0MIWm0+7e73567T3t6+9yTa2grVc8pn8g03gBlbPvxhErt2Me2aa+g47jia16+ncdMmzIzuyZMZf++9JNvb2fyxj/HSWWcF2954I55KsfXcc0sSi6XTTL36ajpf9Sq2v/3tsRxDRIZmw+4NPPTiQ2zr3kY6m2bqqKm0NLdw0uSTBr1+OpumwRq48/k72dC5gQWvWlDmsymsq8tYsmQyHR1Jzj13M4ccUp2tJwBbt6aYODFNIgFdXQkWL57CzJldvPOdLw9730uWHML69U1MmpRm/PigDKZP38Mb37hr2PsermuumYIZHHRQhu3bk3R0JPngB7dw2GE9lQ5NROpUa2vr3ufjxo2z3Pei3ma7AvhFOA9K0sw+BHwRuHw4gZlZEjgbeGOhddx9Y/hzq5n9nKA15/5C6+eebLm0tbXtd9zEu95F49KlTPzNb7D2dpgwgeZzziHxxBM0f/nL+MSJZI86Ck44geTq1UzZupUJ4faN48bBhAmMK9V5uNN0yCGMO/hgJsZ1jBj1L1spDZVrfAZTtv6yMzozmvGJ8XuXTRgzoeD2UdZf0bOCzvbOqvp8Fy5sJJ1OcOSRWZ5+eixPPz34vvXl+s7mHmLDBmPUqCZmzcrQ2nrwsPd91FEpJk7c738wBx/cS2trZXMM2trauPjiMa8YyGDr1jHMmaO7+kOlv7PxUdnGo5rKNeoww9eZ2UvA+cDzwEeAr7j7/xvm8d8G/NXdN+R708wOBBLuvjN8fjrwtWEeM3aFZn7PHn882VmzsEyG7JQpZD76URIXXEBi48ZgRK+ODhLbtpU0QR4zfOxYbOvW+I4hEqNiuRWlzLuoRA7HYPNfajVfphb71seRL1PNXXhqaSADEal/kTsqu/vtwO1DOYiZLQFOBSaa2Qbg39z9R8A5BKOD5a47FbjW3d8BTAZ+HuTRkwRucfdfDSWGsio083smg0+aROZ1ryPzvvcBkD3iCJKPP07jwoVYezueSJQ0QR4gc/zxNC5dGusxROJSLLeilHkX1Z7DUcuq+cI8n2L5MvWeq1ELAxmISP0r+F/YzD4WZQfufl2EdT5UYPm8PMteAN4RPl8DHBsljpqQSkFDA4mnn6Zx0SK8qQnGjCFzwgnB0MM5rS15DXE+k0ItOiK1oNjkhEOduHCwx5GRY6BE9lqadHKwamUgAxGpf8VuE54XYXsHBqygSMgMduwg+Ze/kHnPe0isW0fy3nvpXrCAzDnnDLj5kOczKdSiI1IDik1OWMqJC2t1EsQ+lZxwsp4MNBdFLU06ORjVPMKYiIw8BSso7n5aOQMZSfamSObOLB9BpPlMNGu8yIikCSdLY6B8mXrN1dAkgSJSTdTRupzcYfx40nPmQEMD2enTSc+ZQ2L37kjbRpnPRLPGi9TGpIWlNio1iikHThlR5xyHqPky9ZarMdyBDOo9N0dEyksVlHJKp6G3l+wxx+xNkm/83veguzvatvlmqO+3rWaNFxmZCe8j8ZwrpR5zNYY7kEE95+aISPnpv1g5FZplfsyY0myrWeOlDhXLrSj03lAS3ms9h0NJ/uWhXI386jU3R0QqQxWUuPXLCXEY2pwkUeYzidjKIlJLiuVWFHovX8L7QN2+aj2Ho9aT/GuFcjXyq9fcHBGpjGLDDM+IsoNwKGApYL+ckE2bSKxahe3eTcPDD5OdNm1Qc5IMOJ/JcFpoRKpUsckJBzNx4UBdoGp1EkQpr1qcdLKc6i03R0Qqo1gLyjMEwwhbkXUcaChpRHUmNyckcc89jLrzTnoPOwzbtYuGxx6j64orIiewDzifiWaNFylIXaCkFGpt0slyqsfcHBGpjGLDDCfKGUhd6pcTknzsMXpbWug9/XR63v9+mi+7jIa//pXMrIh3bSPMZ6JZ40XyUxcokfgoN0dESkk5KHHKzQkJKyuMGwc9PSTa2rC1a0lt24Y3NdGwdm1J5i3RrPEitZ/wPhQj8Zyleig3R0RKKVIFxcySwAXAKcBEcrp9ufvJ8YRWB3JzQsLKCgAbN9J4yy1ghq1ZQ/P//b+k3/teEtu3D3/eEs0aL1Wo3POS1HrC+1Bs6NjAQy88RHdvN4bRcmBL/Z/zCJzvplopN2fwNHeMSGFRW1C+C8wBFgPfBL4EzAdujSmu+pCbE5JMQm8vtmMHicZGssccAy0tNKxaBTt2VMWJhAAAIABJREFUkJ05k8ypp2reEqlL5Z6jYyQmvG/p3MLhYw/fW8YXHHdBpUOKneZ+qR7KzRk8zR0jUljUPJOzgX9w9yuBTPjz3cBpsUVWJzLHH0/iuedoXLSIhscegz178IMPxkePJvHSS8HQw5Mnk9i2TfOWSN06s/VMvnLiV5h50MyKxbB2x1qufeRanmt/bm8XqGVrllUsnlKrhjIut5F4zlI/5s1L84Uv9PCJT/Rw0UU9NDbCypWqaItA9BaUUcDz4fMuMxvl7n81szfEFFfd2JsT8sc/0nvIISTb2kjefTfZZ54he+SRMHUqtm3bvrlKNG+J1KFqSFCv925f1VDG5TYSz1nqh+aOESksagXlSeBNwEpgFfBVM+sANsYVWN0Ic0Iy6TSNTz9N5oQTSP3ylyTWr2fPN75B409+Ai+8AE1Nwfqat0Rk2PLlJpSi25dyHkSk1DR3jMgrRa2gfAboG4rjYmAhMAb4VBxB1aPkihVkjziCnosuwsePJ3nvvTQ89RTe2Iht2UJ24kRob9e8JSIlEFdugnIe4qFkYRmpNHeMSH6RclDc/Y/u/nD4vM3d3+bux7v77+MNr06EQwz7IYeAGZlTTsHSaVI/+xmJ9euxXbtIPPMMTVdfrXlLREogrtwE5TzEY8mSFOvXG6nUvmThNWuKzREsUvty546ZP19zx4jkinwL0MzmAB8CpgIvALe6+z1xBVZXcudDIchLyRx3HInNm+mdPZv0WWfRsHYt2QkTNG+J1KVyz9ERV25CNec8lKuM4+jmNm9empYWJ5EI7ihffnkzK1cmmTGj+MhQI2XuF7Uw1SfNHSNSWNR5UD4HfAG4HvgTcDhwi5n9p7t/O8b46kPufCgQDD88eTK9r3416Y99DNzx1atJrlr1/9u79/io6zvf46/PZDKJQgggQrgLEuyxtl4OFVqtWmsV3RZ73O1ZlbZyXC/F2/b0arfl2NOLtd09u13bglcKVqFtWq3Wrbd126hVQKy2VayNSIBwRzAEEpJM5nP++P0CQ0hgEjLzm5m8n49HHpnfb36Xz3zFzHzm+/18v8Qff/yIF2sU6Y1c1FUMxDU6ci1XkwBkY5hbX4uFi33ig06Hm4722Wdj/PznCXbuNI46yrn88jaOO86V1OQ5rR0j0rNM310+B5zr7q927jCznwBPAUpQDid9PRR32LXrgFqT2LJlJGpqSE2ZQmzz5iNfrFGkF3JRVzEQ1+jItVyt/TKrehaXnHAJ9792P/WN9f167d4WCw+U9W4O18P0ne+UY+aMHAkbNxrz5h3FiScmmTTJtcZGHtPaMSI9y3QdFIA3u2y/BegvXYb2rYeyYMFBtSbx5ctJTZxI29y5tF53HZZKEa+tjThiGShyUVeh2o3ikShJELPevHVkJr1Y+JprVCycbsyYIDmB7nuYvv3tvTz8cAs//nELixa1UFoK7qY1NkSkYGX61+rrwL1m9nWgARgPzANuMdv/TuXuqf4OsFjsWw9l5UpSVVX7a03CAvpUdTWYabFGyblc1FXkunYjW7UJA6XmIdfSi4Wvv17Fwj3pqYfp1FP3v/XW18doa4MJEw6d1IiI5LNME5Q7w9+XEfSadE6vMjt8zsL9Jf0aXTEJ10NpmzbtwP1dCugBLdYocoSyVZswUGoeck3FwoeXyXS0W7bALbeUM3iwc+ONwXuI1tgQkUKUaYIyKatRDGRdC+hBizWKHKFs1SYMlJqHXFOx8KFl0sO0bRtcffXRtLTAD36wl6FDtcaGiBSujBIUd18LEA7nGuXum7Ia1UBymAJ6EZF8ko1hbioWPrTD9TBt3x4kJ42N8P3v7+Wkk1IaNiciBS3TaYaHAvOBvwPagUFmNgs43d2/lsX4Cpc7sXDqYC8r2z91cDf7k9Onk6ipIbFgAdbYqMUaJadyUVeh2o3ioWFuuXe4HqbPfvYotmwxRo1KMX9+UO/V3AyjR6NhcyJSkDId4nUHsBOYCKwK971AMMWwEpRu9DR1cGzVqoP3f/nLtF1++cEF9CI5kIsPnPnwoTYX670MBBrmlnuH62EaOtSZNClIYPbsCRIYs9S+KYU1bE5ECk2mCcqHgTHu3m5mDuDu28xsZPZCK2zpUwezaxflt95KvLaWktpabONGqKjAS0qIv/oqpY88QvunP31wAb1IDuTiA2d392hoaqDm9ZqcJQy5WO9FJAo//KF6sESkuGQ6mX0jMCJ9h5lNADKqRTGzhWa21czSF3r8upltMLNXwp+Lejh3ppm9YWZvmtnNGcYbrXDqYB858sCpg5ctI/7ii9DSQuKxxyh98EFiDQ2UPvAANDZGHbVITnUmDBuaNrBpT/bL2rQWi4iISGHINEG5B/ilmX0IiJnZ+4HFBEO/MrEImNnN/n9z91PCn990fdLMSoAfARcCJwKXmdmJGd4zOj1MHVxSV4cPHgzupI4+Gq+qwhMJYmvXEn/ssejiFYlArhOGbC0wKCIiIv0r03EO3wVaCJKFUmAhwfon/57Jye7+jJkd14f4TgfedPe3AMzsp8DF7K+DyU/dTR3c1gYdHXhFBbHVq/GxY/FEAnvnHYjFiL/wAslLL40uZsk7xV4zkevFG0VERKQwZDrNsBMkIxklJL1wg5l9GlgJfN7dd3Z5fiywPm27AZjezzH0v+6mDt66FS8vhzApsViMjnHjsN27Ye/e4FiRNKqZEBERkYEo02mGPwTUu/saM6si6FFJAV9x9819vPcC4JsEK9B/k2BGsCv7eK196urqjvQS/XLfQWPHcszjj7P3G9+gpKmJlt278SFDKKuvp3LHDrypidZYjNSIEZQ1NNC+fn1ksee7gdouJ9qJvGfke/j1+l/T0NzQ7+2QL+26dctWdjTvyFk8ubhfvrRtsVG7Zo/aNjvUrtmjts2OXLZrdXV1j89l+rXsfKBzwYJ/DX+3AHcBs/oSlLtv6XxsZncDj3Zz2AZgfNr2uHBfjw71YrOlrq7u4PtOmUJs0iQqVq7EJ0wgOXMmZZ/7HPG6OqykBFIpBq1bR8uNN1L6k59QMmhQJLHnu27bdoBZ3rac5sbmfm2HfGrXka0j+/31dadzLZaW8haGJIbwbPOzWVmLJZ/atpioXbNHbZsdatfsUdtmRz61a6YJylh3X2dmcYJEZSLQBmzs643NbHTaivT/A3i1m8NeBKrNbBJBYnIpcHlf75lTZqSmTTtg6uDY1q1QVkZq2DCsuRk6Okg8/jh0dJAaP/4QFxMpPrlevDEf1mIRERGRw8s0QdllZqOAk4BV7r7bzBIEBfOHZWZLgXOAEWbWANwCnGNmpxAM8aoHrg2PHQPc4+4XuXvSzG4AngBKgIXu/lrGry6fpFIQi9Fx8snYpk2wfTvs2UNs82ZSVVWkTjkl6ghFcirXCUNv13sp9kkKRERE8lWmCcoPCHozEsBnw31nAH/J5GR3v6yb3ff2cOxG4KK07d8AB01BXHCam7GODjrGjcNPPx3bsIH4M89ALEbqPe8hNWFC1BGK5FS+r0iuSQpERESikeksXt81s4eADndfHe7eAFyVtcgKmTuxl14ivnIlXlZGcuZMfNQovKQEa22lfcYMEjU10NGBxWL44MGkKitJ3HHH/uNHj476VUjEcj0ESg40q3oWl5xwCfe/dj/1jfVRhyMiIjJgZLxqmbv/NS056dz+c3bCKmyxZctILFkCqRSxzZtJ3H47NDUFUw9v2kTq9NNpO+88bM8eOkaPJnnmmSQefvjA47Wy/ICXPgSqalCVaiYy0NDUQM3rNdz5yp3c/crdR3QtLewoIiISDY1byIL48uWkJk6kbe5c2LWL8ltvJV5bS/uFF1J+990c9bGPEdu4EWIx9n7ta5Q++2y3xydn9WmCNCkS+T4EKh9pWJZI5tasMZ5/Ps7q1SMZP76Us85KcvzxHnVYIiKZ96BIhtyxXbvwkSPBDCorSY0YQWzbNpJXXknrRRdR0tAAlZW0f+QjJGpqsK1buz1eRHpnVvUs5p0xjynDpkQdikjeW7q0lHXrjHjc2bzZuOuuMt56y6IOS0REPSj9rr0dkkm8NG2Cs9JSaG0FM2JNTXS8+90kzz+f5Ac+QNndd2MbN9Jx2mkHHy8ivZIoSUQdgkjBmDOnnaoqZ/XqbYwZM5TbbitnxYo4kye3Rx2aiAxwSlD6W2kpxONYe9of+PZ2qKggtmwZ8RUrSE2dGtSaLFpEasgQ4mvWdHu8SD4olul2e/s6NEmBFLsxY/YP59q502hthSFDNMRLRKKnBKW/mQXF8Fu3gjvs2kVs+3aSJ5xA/Pe/xysqaL/gApLnn0/5rbdiDQ14PN7t8SL5oFjqOnr7OrSwowwUzc0xamoSVFQ4556bjDocERElKNmQnD6dRE0NiQULsMZGPBYjedZZlL38Mj54MJZM7qs1KVm7llR1NbG1aw88/uyzo34ZIkDxTLfb29ehSQpkINizB5YsGUUiATfc0EZ5edQRiYgoQcmK1IwZtJWWEl+5klRVFck5c+Doo6GjAwYP3t9b0tGBNTbS8b73kRo79sDjKyujfhkiQGHVdRxqWFYhvQ6RXGhuhjvuSLB7dwlf/Wobo0ZpeJeI5AclKNlgRmraNNqmTdu/zx3icTqOO25fb0n897/H43GS55wDlZUHHi8ih9W1ruTsCWdrWJZIhhYvTrBpU4whQ5I88UTwcaC6OsWZZ3ZEHJmIDHRKUHIlrE0BaJs5k/hzzwGQ/MQn1Fsi0kdd60o0LEskc0OGOJMnp9i2LUVLSzC9cEtLxEGJiKAEJac6a1PiiQS2dy8dJ51E+8UXRx2WSMEqlvqY/lAss61J7syeHcweWVe3lepqfVEmIvlDCUoOdVubot4TyXP5PN1ub+pK8vl19IdimW1NRERE72K51F1tikieK5bpdovldfREvUkiIlIslKCIyCEVS11HsbyOnmiWMhERKRaxqAMQERERERHppB4UESlYxV5XIiIiMhApQckld2IvvUR85Uq8rIzkzJn46NFRRyUFqi+zNnWe88b6Nxi1Z9RB5xTaTFDFXldSaNasMZ5/Ps6uXUZ5uXPWWUmOP16L/4mISO8oQcmh2LJlJGpqSE2ZQmzzZhK3307rzTdrJi/pk77M2tR5zva920ntSfXLNaNU7HUlvZEPvUlLl5ZiBsceC5s3G3fdVca117YyebKSFBERyZxqUHIovnw5qYkTaZs7l9brrsNSKeK1tVGHJQVqVvUs5p0xjynDpvT6nImDJvbbNSU/pPcmVQ2qiqQ3ac6cdr785TauuqqNm25qI5GAFSvyP9EVEZH8oneOXHHHdu0iVV0NZlBZSWrECGLbtkUdmRSovszadLhzNBNU4cqH3qQxY/b3lOzcabS2BquVi4iI9IZ6UHKlvR2SSby0dP++0lJobY0uJhGRLNi9G+67L0FFhXPuucmowxERkQKjHpT+1lMhfGkpxONYe/v+Y9vboaIiulhFRPrZnj0wf34ZLS1www1tlJdHHZGIiBQa9aD0s9iyZSSWLIFUal8hPI2NYIYPGYJt3Qru0NhIbPt2UsceG3XIIiL9orkZ7rgjQWMjzJ3bxqhRGt4lIiK9px6UfpZeCM+uXZTfeivx2lqSs2aRnD6dsvnzOeqTn8Ta20lVVZE8++yoQ5YI9Md0vn2ZtanznI0tGxmcGHzQOfkwE5QUrsWLE2zaFKOqKsUTTwRvL9XVKc48syPiyEREpJAoQelPhyuE9/3fJjrgrm8XB6r+mM63L2uAdJ5TWVrJsYOOPeicQltXpNDWbSl2Q4Y4kycH01e3tFj4O8qIRESkEClB6U+HKYSPr1hBx7RptN1000G9KzKwzKqexSUnXML9r91PfWN9n67Rl1mbOs+pq6ujurq6X64ZpUJbt6XYzZ7dfviDREREDiMnNShmttDMtprZq2n7/tnM/mJmfzKzh8xsaA/n1pvZn83sFTNbmYt4+6ynQviysn29Kz5ypKYZFhIlCWKmErAjpXVbREREik+uPiEtAmZ22fcUcJK7vxf4K/CVQ5z/IXc/xd2nZSm+/nGoQnhNMyzS75ToiYiIFJ+cvLO7+zPAji77nnT3zgnylwHjchFLtiWnTye2di2JBQsomz8fj8WCQvhD9a6IiIiIiAiQP9MMXwk81sNzDjxpZi+Z2TU5jKlPUjNm0Hb55RCLkaqqCupNKis1zbCIiIiISAYsVzNJmdlxwKPuflKX/V8FpgGXeDfBmNlYd99gZiMJhoXdGPbI7NPY2LjvvLq6uixE3z8GvfIKxzz+OHsnTKCkqYmS3bvZeM01pLRY44DTsKeBF7a9wPbW7bSn2hlz9Biqyqs4c9SZUYdWkB5e9zANzQ1c/67row5FutHQkODllyvYvbuEsrIU06Y1MWGChreKiAxk6ZP1VFZWWvpzkU57Y2ZzgI8CH+4uOQFw9w3h761m9hBwOvBMd8cC3c5MlG09zYh0kClTiE2aRMXKlfiECSRnzuT40aOzH2ABy7htC4zvcAYnBzM0tn9uiOEVw3P2WoulXTvXbWkpb2FIYgjPNj8b+botxdK2/ammJoEZjBkD27bBk0+O5tprW5k8OfMvyNSu2aO2zQ61a/aobbMjn9o1sgTFzGYCXwLOdvfmHo4ZBMTcvSl8fD7wjRyG2b/MSE2bRtu0/K71l+wrtOl881WhrdsyUM2Z005VlROLwZ49cNtt5axYEWfyZE1LLCIiB8tJgmJmS4FzgBFm1gDcQjBrVxnwlJkBLHP3z5jZGOAed78IGAU8FD4fB5a4++O5iFlE8p8SvcIwZsz+npKdO43W1mBRRxERke7kJEFx98u62X1vD8duBC4KH78FnJzF0EREJEd274b77ktQUeGce27y8CeIiMiAlC+zeImISBHbswfmzy+jpQWuuaaN8vKoIxIRkXylBEVERLKquRnuuCNBYyPMndvGqFEa3iUiIj2LdBYvkYGqoamBFxpeYEfrDmLEuPqUq6MOSSRrFi9OsGlTjKqqFE88EbztVFenOPPMjogjExGRfKQERSQCyzYsY9Xbq+jwDuIx/W8oxW3IEGfy5BQALS0W/o4yIhERyWf6ZCQSgVnVs7jkhEu4/7X7qW+sjzockayaPVvTCYuISOaUoIhEIFGSiDoEERERkbykBEUkAp01KLXratm5d2fU4YiIiIjkDc3iJRKBzhqUnXt30tTWFHU4IiIiInlDCYpIBGZVz2LeGfMYNWhU1KGIiIiI5BUN8RKJwIamDTxd/zRvt7yNu7PwjwsZWzGWCyZfEHVoIiIiIpFSgiISgfZUO83JZgaVDqK1o5W9HXvZ27E36rBEREREIqcERSQCU4dPZerwqdz36n3UN9Zz3WnXRR2SiIiISF5QDYqIiIiIiOQN9aCIRGDNO2t4uv5pNu3ZRDKVVA2KiIiISEgJikgEOmtQjjnqGADVoIiIiIiElKCIRKCzBkVEREREDqQaFBERERERyRtKUEREREREJG8oQRERERERkbyhBEVERERERPKGEhQREREREckbSlBERERERCRvKEEREREREZG8oXVQouZO7KWXiK9ciZeVkZw5Ex89OuqoREREREQioR6UiMWWLSOxZAmkUsQ2byZx++3Q2Bh1WCIiIiIikVCCErH48uWkJk6kbe5cWq+7DkuliNfWRh2WiIiIiEgklKBEyR3btQsfORLMoLKS1IgRxLZtizoyEREREZFIKEGJUns7JJN4aen+faWl0NoaXUwiIiIiIhHKWYJiZgvNbKuZvZq2b7iZPWVmdeHvYT2ce0V4TJ2ZXZGrmLOutBTicay9ff++9nYoK4suJskbDU0N1Lxew52v3Mndr9wddTgiIiIiOZHLHpRFwMwu+24Gnnb3auDpcPsAZjYcuAWYDpwO3NJTIlNwzPAhQ7CtW8EdGhuJbd9O6thjo45M8sCyDctY9fYqNjRtYNOeTVGHIyIiIpITOUtQ3P0ZYEeX3RcDi8PHi4GPd3PqBcBT7r7D3XcCT3FwolOwktOnE1u7lsSCBZTNn4/HYiTPPjvqsCQPzKqexbwz5jFl2JSoQxERERHJmajXQRnl7p1fDW8GRnVzzFhgfdp2Q7ivKKRmzKCttJT4ypWkqqpIzpkDlZVRhyV5IFGSiDoEERERkZwzd8/dzcyOAx5195PC7XfcfWja8zvdfViXc74AlLv7t8LteUCLu/9L5zGNjY37XkRdXV1WX4NIrj287mEamhu4/l3XRx2KiIiISL+orq7e97iystLSn4u6B2WLmY12901mNhrY2s0xG4Bz0rbHAb/r6YLpLzZX6urqIrnvQKC2hZGtI2lubO7XdlC7Zo/aNjvUrtmjts0OtWv2qG2zI5/aNepphh8BOmflugJ4uJtjngDON7NhYXH8+eE+EREREREpMrmcZngp8AJwgpk1mNk/ALcBHzGzOuC8cBszm2Zm9wC4+w7gm8CL4c83wn0iRW3NO2u455V7WNu4lmQqycI/LuSJt5Sbi4iISHHL2RAvd7+sh6c+3M2xK4Gr0rYXAguzFJpIXmpPtdOcbOaYo44BYG/HXvZ27I04KhEREZHsiroGRUR6MHX4VKYOnxp1GCIiIiI5FXUNioiIiIiIyD5KUEREREREJG8oQRERERERkbyhBEVERERERPKGEhQREREREckbSlBERERERCRvKEEREREREZG8oQRFRERERETyhhIUERERERHJG0pQREREREQkbyhBERERERGRvGHuHnUMR6yxsbHwX4SIiIiIyABUWVlp6dvqQRERERERkbyhBEVERERERPJGUQzxEhERERGR4qAeFBERERERyRtKUI6Qmc00szfM7E0zuznqeIqBmY03s9+a2Soze83M/jHqmIqNmZWY2ctm9mjUsRQLMxtqZr8ws7+Y2etm9v6oYyoWZva/w78Fr5rZUjMrjzqmQmRmC81sq5m9mrZvuJk9ZWZ14e9hUcZYqHpo238O/x78ycweMrOhUcZYiLpr17TnPm9mbmYjooit0PXUtmZ2Y/jv9jUz+15U8SlBOQJmVgL8CLgQOBG4zMxOjDaqopAEPu/uJwIzgOvVrv3uH4HXow6iyPw78Li7vws4GbVvvzCzscBNwDR3PwkoAS6NNqqCtQiY2WXfzcDT7l4NPB1uS+8t4uC2fQo4yd3fC/wV+EqugyoCizi4XTGz8cD5wLpcB1REFtGlbc3sQ8DFwMnu/m7gXyKIC1CCcqROB95097fcvQ34KcF/WDkC7r7J3f8QPm4i+KA3NtqoioeZjQP+Brgn6liKhZlVAmcB9wK4e5u7vxNtVEUlDhxlZnHgaGBjxPEUJHd/BtjRZffFwOLw8WLg4zkNqkh017bu/qS7J8PNZcC4nAdW4Hr4Nwvwb8CXABVS91EPbTsXuM3dW8NjtuY8sJASlCMzFliftt2APkj3KzM7DjgVWB5tJEXl+wR/2FNRB1JEJgHbgB+HQ+fuMbNBUQdVDNx9A8G3eOuATUCjuz8ZbVRFZZS7bwofbwZGRRlMEbsSeCzqIIqBmV0MbHD3P0YdSxGaCnzQzJabWa2ZvS+qQJSgSN4ys8HAL4HPuvuuqOMpBmb2UWCru78UdSxFJg6cBixw91OBPWioTL8IayIuJkgCxwCDzOyT0UZVnDyY1lPfSPczM/sqwdDlB6KOpdCZ2dHAPwH/J+pYilQcGE4wvP6LwM/NzA59SnYoQTkyG4Dxadvjwn1yhMyslCA5ecDdH4w6niJyBjDLzOoJhiSea2b3RxtSUWgAGty9s6fvFwQJixy584A17r7N3duBB4EPRBxTMdliZqMBwt+RDekoRmY2B/goMNu1rkN/OJ7gy4o/hu9j44A/mFlVpFEVjwbgQQ+sIBhpEckkBEpQjsyLQLWZTTKzBEHh5iMRx1Twwmz9XuB1d//XqOMpJu7+FXcf5+7HEfx7/S9317fRR8jdNwPrzeyEcNeHgVURhlRM1gEzzOzo8G/Dh9EEBP3pEeCK8PEVwMMRxlJUzGwmwXDaWe7eHHU8xcDd/+zuI939uPB9rAE4LfwbLEfuV8CHAMxsKpAAtkcRiBKUIxAWv90APEHwhvlzd38t2qiKwhnApwi+3X8l/Lko6qBEDuNG4AEz+xNwCnBrxPEUhbBX6hfAH4A/E7xv3RVpUAXKzJYCLwAnmFmDmf0DcBvwETOrI+itui3KGAtVD237Q6ACeCp8H7sj0iALUA/tKv2gh7ZdCEwOpx7+KXBFVD1/WkleRERERETyhnpQREREREQkbyhBERERERGRvKEERURERERE8oYSFBERERERyRtKUEREREREJG8oQRERKXJmtsjMvtXDc3PM7LlcxxTeu8e4cnT/D5rZG4d4/pDxmdnXe7vQqZktNbOP9+acDK45ysxeN7Oy/ryuiEhUlKCIiBQYM6s3s/OijqM3okyEeuLuz7r7CYc/EszsHDNrOJL7mdl7gZPp58UQ3X0L8Fvgmv68rohIVJSgiIiI5Ma1wANZWvjsgfD6IiIFTwmKiEgEwl6Qr5jZKjPbaWY/NrPytOc/Gq4+/Y6ZPR9++46Z/QSYAPzazHab2ZfC/TVmttnMGs3sGTN7dx/jepeZPWVmO8zsDTP7n2nPLTKzH5nZf5hZk5ktN7Pj054/Pzyn0czmm1mtmV1lZv8NuAN4fxjzO2m3HNbT9brE9fdmtsbMhoTbF4av99hujl1sZp8PH481Mzez68Pt48PXFuvaK2Jmp5rZH8JYfgaUh/sHAY8BY8L4d5vZmPC0hJndF57zmplNO0TzXgjUdon16nB4VlP4b+G0cH+9mX3RzP5kZnvM7N5wKNdj4bH/aWbD0i61nGAF6ImHuL+ISEFQgiIiEp3ZwAXA8cBU4GsQfFAGFhJ8I34McCfwiJmVufungHXAx9x9sLt/L7zWY0A1MBL4A8E36r0SfhB/ClgSXudSYL6ZnZh22KXA/wWGAW8C3w7PHQH8AvhKGPMbwAcA3P114DMdBRuWAAAEnElEQVTAC2HMQw93va7c/WfA88DtZnYMcC9wlbtv6+bwWuCc8PHZwFvAWWnbz7p7qstrTwC/An4CDAdqgL8N772HILnYGMY/2N03hqfOAn4KDAUeAX7YXfxh204K26Vz3yeArwOfBoaE13o77bS/BT5C8G/jYwT/jf8JOJbg/fumtPZJErTfyd3dX0SkkChBERGJzg/dfb277yD4YH5ZuP8a4E53X+7uHe6+GGgFZvR0IXdf6O5N7t5K8KH3ZDOr7GU8HwXq3f3H7p5095eBXwKfSDvmIXdfEX4gfgA4Jdx/EfCauz8YPnc7sDmDe/Z0ve5cD5wL/A74tbs/2sNxtcCZZhYjSEy+B5wRPnc2XXoxQjOAUuD77t7u7r8AXswg/ufc/Tfu3kGQ3PSUIHQmZU1p+64CvufuL3rgTXdfm/b8D9x9i7tvAJ4Flrv7y+6+F3gIOLXLPZrS7iMiUrCUoIiIRGd92uO1QOewoYnA58PhXe+EQ6LGpz1/ADMrMbPbzGy1me0C6sOnRvQynonA9C73nQ1UpR2TnnQ0A4PDx2PSX09YZ5FJUXlP1zuIu79D0LNxEvD/DnHcamAPQbLzQeBRYKOZnUDPCcoYYEOX+pC13Rx3uPjLzSzezXGdw9oq0vaNB1Yf4tpb0h63dLPdta0q0u4jIlKwlKCIiERnfNrjCUDnsKH1wLfdfWjaz9HuvjR8vmuR9eXAxcB5QCVwXLjfehnPeqC2y30Hu/vcDM7dBIzr3DAzS9/uJuZeM7NTgCuBpQQ9NIdSC/wdkAh7IGqBKwiGkr3SzfGbgLFh3J0mpD0+ovjDYWKrCYZrdVpPMLzviIVJ0RTgj/1xPRGRKClBERGJzvVmNs7MhgNfBX4W7r8b+IyZTbfAIDP7GzPr/PZ9CzA57ToVBEPA3gaOBm7tYzyPAlPN7FNmVhr+vC8scj+c/wDeY2YfDz8sX8+BPS9bgHFhrUevWTCBwP0ENRj/iyCZuO4Qp9QCNwDPhNu/C7efC4djdfUCkARuCl/3JcDpXeI/pg/D5tL9hqAHp9M9wBfM7L+H/52nHEGR++kEw/My6fUREclrSlBERKKzBHiSoIh7NfAtAHdfCVxNUHC9k6D4eU7aed8BvhYOw/oCcB/BcKQNwCpgWV+Ccfcm4HyCwvWNBMOXvgscdgFAd99OUKvyPYJE6URgJUHiBPBfwGvAZjPb3ofwvgOsd/cFYZ3NJ4FvmVl1D8fXEiRunQnKcwTJ2zPdHezubcAlBO28A/h74MG05/9C0HPzVtju3Q63O4y7gNmdvTTuXkNQe7SEoH7kVwQF+n0xm2CmNBGRgmfZmY5dREQOxczqCWah+s+oY8mGsEC9AZjt7r+NOp58YWZLgJ+7+6/68ZojCRKyU8MCehGRgtZdIZ+IiEivmdkFBOtxtABfJKiB6VNvTrFy98uzcM2tQCbD8ERECoKGeImISH95P8FQte0E63Z83N1bog1JREQKjYZ4iYiIiIhI3lAPioiIiIiI5A0lKCIiIiIikjeUoIiIiIiISN5QgiIiIiIiInlDCYqIiIiIiOQNJSgiIiIiIpI3/j9HtV0AITTzwQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(12, 6));\n",
    "\n",
    "h_label = 'petal length x width (cm)'\n",
    "v_label = 'sepal length x width (cm)'\n",
    "\n",
    "for c in df['target'].value_counts().index.tolist():\n",
    "    df[\n",
    "        df['target'] == c\n",
    "    ].plot(\n",
    "        title='Class distribution vs the newly derived features',\n",
    "        kind='scatter',\n",
    "        x=h_label,\n",
    "        y=v_label,\n",
    "        color=['r', 'g', 'b'][c],\n",
    "        # marker=['1', '2', '3'][c],\n",
    "        marker=f'${c}$',\n",
    "        s=64,\n",
    "        alpha='0.5',\n",
    "        ax=ax,\n",
    "    )\n",
    "    \n",
    "# ax.set_xlim(0, df[h_label].max() + 1)\n",
    "# ax.set_ylim(0, df[v_label].max() + 1)\n",
    "    \n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Split Data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_train, df_test = train_test_split(df, test_size=0.3, random_state=13)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "150 105 45\n"
     ]
    }
   ],
   "source": [
    "print(df.shape[0], df_train.shape[0], df_test.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',\n",
       "       'petal width (cm)', 'target', 'target_names',\n",
       "       'petal length x width (cm)', 'sepal length x width (cm)',\n",
       "       'petal length x sepal length (cm)', 'petal width x sepal width (cm)'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "109    2\n",
       "39     0\n",
       "93     1\n",
       "42     0\n",
       "54     1\n",
       "      ..\n",
       "126    2\n",
       "98     1\n",
       "16     0\n",
       "74     1\n",
       "82     1\n",
       "Name: target, Length: 105, dtype: int64"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train['target']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train Classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "clf = DecisionTreeClassifier()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = df_train[iris.feature_names]\n",
    "x_test  = df_test[iris.feature_names]\n",
    "\n",
    "y_train = df_train['target']\n",
    "y_test  = df_test['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini',\n",
       "                       max_depth=None, max_features=None, max_leaf_nodes=None,\n",
       "                       min_impurity_decrease=0.0, min_impurity_split=None,\n",
       "                       min_samples_leaf=1, min_samples_split=2,\n",
       "                       min_weight_fraction_leaf=0.0, presort='deprecated',\n",
       "                       random_state=None, splitter='best')"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = clf.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9777777777777777"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_score(y_test, y_test_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2    19\n",
       "0    14\n",
       "1    12\n",
       "Name: target, dtype: int64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "45"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Class 0: 12, class 1: 8, class 2: 18\n",
    "13 + 16 + 16"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_train.shape[0] / (df_train.shape[0] + df_test.shape[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.0"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = clf.predict(x_train)\n",
    "accuracy_score(y_train, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature_importances</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>feature_names</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>petal length (cm)</th>\n",
       "      <td>0.576892</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>petal width (cm)</th>\n",
       "      <td>0.394436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <td>0.028673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   feature_importances\n",
       "feature_names                         \n",
       "petal length (cm)             0.576892\n",
       "petal width (cm)              0.394436\n",
       "sepal width (cm)              0.028673\n",
       "sepal length (cm)             0.000000"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'feature_names': iris.feature_names,\n",
    "        'feature_importances': clf.feature_importances_\n",
    "    }\n",
    ").sort_values(\n",
    "    'feature_importances', ascending=False\n",
    ").set_index(\n",
    "    'feature_names'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('sepal length (cm)', 0.0),\n",
       " ('sepal width (cm)', 0.028672856362643374),\n",
       " ('petal length (cm)', 0.5768915913774021),\n",
       " ('petal width (cm)', 0.3944355522599546)]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[\n",
    "    (feature, coeff) \n",
    "    for feature, coeff in zip(\n",
    "        iris.feature_names,\n",
    "        clf.feature_importances_\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Which species is it?\n",
      "\n",
      "|--- petal length (cm) <= 2.4\n",
      "|   |--- class: 0\n",
      "|--- petal length (cm) >  2.4\n",
      "|   |--- petal width (cm) <= 1.8\n",
      "|   |   |--- petal length (cm) <= 5.5\n",
      "|   |   |   |--- petal width (cm) <= 1.7\n",
      "|   |   |   |   |--- petal length (cm) <= 5.0\n",
      "|   |   |   |   |   |--- class: 1\n",
      "|   |   |   |   |--- petal length (cm) >  5.0\n",
      "|   |   |   |   |   |--- petal length (cm) <= 5.0\n",
      "|   |   |   |   |   |   |--- class: 2\n",
      "|   |   |   |   |   |--- petal length (cm) >  5.0\n",
      "|   |   |   |   |   |   |--- class: 1\n",
      "|   |   |   |--- petal width (cm) >  1.7\n",
      "|   |   |   |   |--- sepal width (cm) <= 2.8\n",
      "|   |   |   |   |   |--- class: 2\n",
      "|   |   |   |   |--- sepal width (cm) >  2.8\n",
      "|   |   |   |   |   |--- class: 1\n",
      "|   |   |--- petal length (cm) >  5.5\n",
      "|   |   |   |--- class: 2\n",
      "|   |--- petal width (cm) >  1.8\n",
      "|   |   |--- petal length (cm) <= 4.9\n",
      "|   |   |   |--- sepal width (cm) <= 3.0\n",
      "|   |   |   |   |--- class: 2\n",
      "|   |   |   |--- sepal width (cm) >  3.0\n",
      "|   |   |   |   |--- class: 1\n",
      "|   |   |--- petal length (cm) >  4.9\n",
      "|   |   |   |--- class: 2\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('Which species is it?\\n')\n",
    "print(\n",
    "    export_text(clf, feature_names=iris.feature_names, spacing=3, decimals=1)\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "6"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.get_depth()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using derived features too"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "features_orig = iris.feature_names\n",
    "# features_new = iris.feature_names + ['petal length x width (cm)', 'sepal length x width (cm)']\n",
    "features_new = ['petal length x width (cm)', 'sepal length x width (cm)']\n",
    "\n",
    "accuracy_scores_orig = []\n",
    "accuracy_scores_new = []\n",
    "\n",
    "for _ in range(500):\n",
    "    \n",
    "    df_train, df_test = train_test_split(df, test_size=0.3)\n",
    "    \n",
    "    x_train_orig = df_train[features_orig]\n",
    "    x_test_orig  = df_test[features_orig]\n",
    "    \n",
    "    x_train_new = df_train[features_new]\n",
    "    x_test_new  = df_test[features_new]\n",
    "\n",
    "    y_train = df_train['target']\n",
    "    y_test  = df_test['target']\n",
    "    \n",
    "    clf_orig = DecisionTreeClassifier(max_depth=2)\n",
    "    clf_new = DecisionTreeClassifier(max_depth=2)\n",
    "\n",
    "    clf_orig.fit(x_train_orig, y_train)\n",
    "    clf_new.fit(x_train_new, y_train)\n",
    "    \n",
    "    y_pred_orig = clf_orig.predict(x_test_orig)\n",
    "    y_pred_new = clf_new.predict(x_test_new)\n",
    "    \n",
    "    accuracy_scores_orig.append(round(accuracy_score(y_test, y_pred_orig), 3))\n",
    "    accuracy_scores_new.append(round(accuracy_score(y_test, y_pred_new), 3))\n",
    "\n",
    "accuracy_scores_orig = pd.Series(accuracy_scores_orig)\n",
    "accuracy_scores_new = pd.Series(accuracy_scores_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy Orig: 0.93 vs New: 0.96\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    'Accuracy Orig: {:.2} vs New: {:.2}'.format(\n",
    "        accuracy_scores_orig.median(),\n",
    "        accuracy_scores_new.median(),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:19: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x432 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 2, figsize=(16, 6), sharey=True);\n",
    "\n",
    "accuracy_scores_orig.plot(\n",
    "    title='Distribution of classifier accuracy [Original Features]',\n",
    "    kind='box',\n",
    "    meanline=True,\n",
    "    grid=True,\n",
    "    ax=axs[0]\n",
    ")\n",
    "\n",
    "accuracy_scores_new.plot(\n",
    "    title='Distribution of classifier accuracy [New Features]',\n",
    "    kind='box',\n",
    "    meanline=True,\n",
    "    grid=True,\n",
    "    ax=axs[1]\n",
    ")\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature_importances</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>feature_names</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>petal width (cm)</th>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sepal length (cm)</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sepal width (cm)</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>petal length (cm)</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   feature_importances\n",
       "feature_names                         \n",
       "petal width (cm)                   1.0\n",
       "sepal length (cm)                  0.0\n",
       "sepal width (cm)                   0.0\n",
       "petal length (cm)                  0.0"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    {\n",
    "        'feature_names': features_orig,\n",
    "        'feature_importances': clf_orig.feature_importances_\n",
    "    }\n",
    ").sort_values(\n",
    "    'feature_importances', ascending=False\n",
    ").set_index(\n",
    "    'feature_names'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature_importances</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>feature_names</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>petal length x width (cm)</th>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>sepal length x width (cm)</th>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           feature_importances\n",
       "feature_names                                 \n",
       "petal length x width (cm)                  1.0\n",
       "sepal length x width (cm)                  0.0"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(\n",
    "    {\n",
    "        'feature_names': features_new,\n",
    "        'feature_importances': clf_new.feature_importances_\n",
    "    }\n",
    ").sort_values(\n",
    "    'feature_importances', ascending=False\n",
    ").set_index(\n",
    "    'feature_names'\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Which species is it? [Original]\n",
      "\n",
      "|--- petal width (cm) <= 0.7\n",
      "|   |--- class: 0\n",
      "|--- petal width (cm) >  0.7\n",
      "|   |--- petal width (cm) <= 1.7\n",
      "|   |   |--- class: 1\n",
      "|   |--- petal width (cm) >  1.7\n",
      "|   |   |--- class: 2\n",
      "\n",
      "Which species is it? [New]\n",
      "\n",
      "|--- petal length x width (cm) <= 2.0\n",
      "|   |--- class: 0\n",
      "|--- petal length x width (cm) >  2.0\n",
      "|   |--- petal length x width (cm) <= 7.4\n",
      "|   |   |--- class: 1\n",
      "|   |--- petal length x width (cm) >  7.4\n",
      "|   |   |--- class: 2\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print('Which species is it? [Original]\\n')\n",
    "print(\n",
    "    export_text(clf_orig, feature_names=features_orig, spacing=3, decimals=1)\n",
    ")\n",
    "\n",
    "print('Which species is it? [New]\\n')\n",
    "print(\n",
    "    export_text(clf_new, feature_names=features_new, spacing=3, decimals=1)\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Small data, accuracy varies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "accuracy_scores = []\n",
    "\n",
    "for _ in range(100):\n",
    "    \n",
    "    df_train, df_test = train_test_split(df, test_size=0.3)\n",
    "    \n",
    "    x_train = df_train[iris.feature_names]\n",
    "    x_test  = df_test[iris.feature_names]\n",
    "\n",
    "    y_train = df_train['target']\n",
    "    y_test  = df_test['target']\n",
    "    \n",
    "    clf = DecisionTreeClassifier(random_state=42)\n",
    "\n",
    "    clf.fit(x_train, y_train)\n",
    "    y_pred = clf.predict(x_test)\n",
    "    \n",
    "    accuracy_scores.append(round(accuracy_score(y_test, y_pred), 3))\n",
    "\n",
    "accuracy_scores = pd.Series(accuracy_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "count    100.000000\n",
       "mean       0.942630\n",
       "std        0.031571\n",
       "min        0.844000\n",
       "5%         0.889000\n",
       "50%        0.956000\n",
       "95%        0.978000\n",
       "max        1.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_scores.describe(percentiles=[0.05, 0.95])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average Score: 0.943 [5th percentile: 0.889 & 95th percentile: 0.978]\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  if __name__ == '__main__':\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(12, 6));\n",
    "\n",
    "accuracy_scores.plot(\n",
    "    title='Distribution of classifier accuracy',\n",
    "    kind='box',\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "fig.show()\n",
    "\n",
    "print(\n",
    "    'Average Score: {:.3} [5th percentile: {:.3} & 95th percentile: {:.3}]'.format(\n",
    "        accuracy_scores.mean(),\n",
    "        accuracy_scores.quantile(.05),\n",
    "        accuracy_scores.quantile(.95),\n",
    "    )\n",
    ")\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Shuffle Split"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import ShuffleSplit\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "accuracy_scores = []\n",
    "\n",
    "rs = ShuffleSplit(n_splits=100, test_size=0.3)\n",
    "\n",
    "for train_index, test_index in rs.split(df):\n",
    "    \n",
    "    x_train = df.loc[train_index, iris.feature_names]\n",
    "    x_test  = df.loc[test_index, iris.feature_names]\n",
    "\n",
    "    y_train = df.loc[train_index, 'target']\n",
    "    y_test  = df.loc[test_index, 'target']\n",
    "    \n",
    "    clf = DecisionTreeClassifier()\n",
    "    \n",
    "    clf.fit(x_train, y_train)\n",
    "    y_pred = clf.predict(x_test)\n",
    "    \n",
    "    accuracy_scores.append(round(accuracy_score(y_test, y_pred), 3))\n",
    "\n",
    "accuracy_scores = pd.Series(accuracy_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  if __name__ == '__main__':\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average Score: 0.947 [5th percentile: 0.889 & 95th percentile: 0.978]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(12, 6));\n",
    "\n",
    "accuracy_scores.plot(\n",
    "    title='Distribution of classifier accuracy',\n",
    "    kind='box',\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "fig.show()\n",
    "\n",
    "print(\n",
    "    'Average Score: {:.3} [5th percentile: {:.3} & 95th percentile: {:.3}]'.format(\n",
    "        accuracy_scores.mean(),\n",
    "        accuracy_scores.quantile(.05),\n",
    "        accuracy_scores.quantile(.95),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import ShuffleSplit\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import cross_validate\n",
    "\n",
    "clf = DecisionTreeClassifier()\n",
    "rs = ShuffleSplit(n_splits=100, test_size=0.3)\n",
    "\n",
    "x = df[iris.feature_names]\n",
    "y = df['target']\n",
    "\n",
    "cv_results = cross_validate(\n",
    "    clf, x, y, cv=rs, scoring='accuracy'\n",
    ")\n",
    "\n",
    "accuracy_scores = pd.Series(cv_results['test_score'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9468888888888888"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "accuracy_scores.mean() # 0.9402222222222224"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:9: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n",
      "  if __name__ == '__main__':\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Average Score: 0.947 [5th percentile: 0.889 & 95th percentile: 0.979]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(1, 1, figsize=(12, 6));\n",
    "\n",
    "accuracy_scores.plot(\n",
    "    title='Distribution of classifier accuracy',\n",
    "    kind='box',\n",
    "    ax=ax\n",
    ")\n",
    "\n",
    "fig.show()\n",
    "\n",
    "print(\n",
    "    'Average Score: {:.3} [5th percentile: {:.3} & 95th percentile: {:.3}]'.format(\n",
    "        accuracy_scores.mean(),\n",
    "        accuracy_scores.quantile(.05),\n",
    "        accuracy_scores.quantile(.95),\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hyper parameters selections"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "@ max_depth = 1: accuracy_scores: 0.571~0.75\n",
      "@ max_depth = 2: accuracy_scores: 0.929~0.968\n",
      "@ max_depth = 3: accuracy_scores: 0.893~1.0\n",
      "@ max_depth = 4: accuracy_scores: 0.925~0.968\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import ShuffleSplit\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import cross_validate\n",
    "\n",
    "df_train, df_test = train_test_split(df, test_size=0.25)\n",
    "\n",
    "x_train = df_train[iris.feature_names]\n",
    "x_test  = df_test[iris.feature_names]\n",
    "\n",
    "y_train = df_train['target']\n",
    "y_test  = df_test['target']\n",
    "\n",
    "\n",
    "for max_depth in [1, 2, 3, 4]:\n",
    "\n",
    "    clf = DecisionTreeClassifier(max_depth=max_depth)\n",
    "    rs = ShuffleSplit(n_splits=20, test_size=0.25)\n",
    "\n",
    "    cv_results = cross_validate(\n",
    "        clf, x_train, y_train, cv=rs, scoring='accuracy'\n",
    "    )\n",
    "\n",
    "    accuracy_scores = pd.Series(cv_results['test_score'])    \n",
    "    print(\n",
    "        '@ max_depth = {}: accuracy_scores: {}~{}'.format(\n",
    "            max_depth, \n",
    "            accuracy_scores.quantile(.1).round(3), \n",
    "            accuracy_scores.quantile(.9).round(3)\n",
    "        )\n",
    "    )\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "@ max_depth = 1: test accuracy: 0.605\n",
      "@ max_depth = 2: test accuracy: 0.947\n",
      "@ max_depth = 3: test accuracy: 0.947\n",
      "@ max_depth = 4: test accuracy: 0.947\n"
     ]
    }
   ],
   "source": [
    "for max_depth in [1, 2, 3, 4]:\n",
    "    clf = DecisionTreeClassifier(max_depth=max_depth)\n",
    "    clf.fit(x_train, y_train)\n",
    "    y_test_pred = clf.predict(x_test)\n",
    "    print(\n",
    "        '@ max_depth = {}: test accuracy: {}'.format(\n",
    "            max_depth, round(accuracy_score(y_test, y_test_pred), 3)\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## K-Fold Cross Validation\n",
    "\n",
    "- Calculating any metric varies a lot, especially with small data\n",
    "- To set model hyper prameters, we need to even split training further into training and devlopment set\n",
    "- Here comes cross validation for the training set\n",
    "- Once we know best hyper parameters, we apply them on the test set \n",
    "\n",
    "Cross Validation:\n",
    "https://scikit-learn.org/stable/modules/cross_validation.html\n",
    "\n",
    "Cross Validation + Parameters Search:\n",
    "https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy @ max_depth=2: 93.31% ~ 97.84%\n",
      "Accuracy @ max_depth=3: 95.57% ~ 99.13%\n",
      "Accuracy @ max_depth=4: 93.31% ~ 97.84%\n",
      "Accuracy @ max_depth=9: 93.31% ~ 97.84%\n",
      "Accuracy @ max_depth=15: 94.53% ~ 100.25%\n"
     ]
    }
   ],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.model_selection import KFold\n",
    "\n",
    "def cross_validate(x_train, y_train, max_depth):\n",
    "\n",
    "    # Do not worry if this code is not very clear, it can replaced by cross_val_score\n",
    "    # https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html\n",
    "    \n",
    "    accuracy_scores = []\n",
    "    \n",
    "    kf = KFold(n_splits=5)\n",
    "    \n",
    "    for train_index, test_index in kf.split(x_train):\n",
    "        \n",
    "        x_train_train, x_train_eval = x_train.iloc[train_index], x_train.iloc[test_index]\n",
    "        y_train_train, y_train_eval = y_train.iloc[train_index], y_train.iloc[test_index]\n",
    "        \n",
    "        clf = DecisionTreeClassifier(max_depth=max_depth)\n",
    "        clf.fit(x_train_train, y_train_train)\n",
    "        y_train_eval_pred = clf.predict(x_train_eval)\n",
    "        \n",
    "        accuracy_scores.append(\n",
    "            accuracy_score(y_train_eval, y_train_eval_pred)\n",
    "        )\n",
    "        \n",
    "    accuracy_scores = pd.Series(accuracy_scores)\n",
    "    \n",
    "    # I am using Z distributiion here for simplicity.\n",
    "    # In practice, you may need to use T distributiion instead.\n",
    "    confidence_interval_min = accuracy_scores.mean() - 1.645 * accuracy_scores.sem()\n",
    "    confidence_interval_max = accuracy_scores.mean() + 1.645 * accuracy_scores.sem()\n",
    "    return (confidence_interval_min, confidence_interval_max)\n",
    "    \n",
    "        \n",
    "def compare_multiple_max_depths(x_train, y_train, max_depths):\n",
    "    \n",
    "    # This and the above combined = GridSearchCV\n",
    "    \n",
    "    for max_depth in max_depths:\n",
    "        \n",
    "        confidence_interval_min, confidence_interval_max = cross_validate(x_train, y_train, max_depth)\n",
    "        \n",
    "        print(f'Accuracy @ max_depth={max_depth}: {confidence_interval_min:.2%} ~ {confidence_interval_max:.2%}')\n",
    "        \n",
    "        \n",
    "cross_validate(x_train, y_train, max_depth=4)\n",
    "compare_multiple_max_depths(x_train, y_train, max_depths=[2, 3, 4, 9, 15, ])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 94.74%\n"
     ]
    }
   ],
   "source": [
    "clf = DecisionTreeClassifier(max_depth=2)\n",
    "\n",
    "clf.fit(x_train, y_train)\n",
    "y_pred = clf.predict(x_test)\n",
    "\n",
    "print(f'Accuracy: {accuracy_score(y_test, y_pred):.2%}')"
   ]
  },
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "How to improve the model:\n",
    "    \n",
    "- Understand the data more, plot?\n",
    "- Try different hyper parameters? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Inspired by the code from Richard Johansson @ Chalmers University of Technology\n",
    "\n",
    "def plot_decision_boundary(clf, x, y):\n",
    "    \n",
    "    feature_names = x.columns\n",
    "    x, y = x.values, y.values\n",
    "    \n",
    "    x_min, x_max = x[:,0].min(), x[:,0].max()\n",
    "    y_min, y_max = x[:,1].min(), x[:,1].max()\n",
    "    \n",
    "    step = 0.02\n",
    "    \n",
    "    xx, yy = np.meshgrid(\n",
    "        np.arange(x_min, x_max, step),\n",
    "        np.arange(y_min, y_max, step)\n",
    "    )\n",
    "    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])\n",
    "    Z = Z.reshape(xx.shape)\n",
    "\n",
    "    plt.figure(figsize=(12,8))\n",
    "    plt.contourf(xx, yy, Z, cmap='Paired_r', alpha=0.25)\n",
    "    plt.contour(xx, yy, Z, colors='k', linewidths=0.7)\n",
    "    # plt.scatter(x[:,0], x[:,1], c=y, cmap='Paired_r', edgecolors='k')\n",
    "    plt.scatter(x[:,0], x[:,1], c=y, edgecolors='k')\n",
    "    plt.title(\"Tree's Decision Boundaries\")\n",
    "    plt.xlabel(feature_names[0])\n",
    "    plt.ylabel(feature_names[1])\n",
    "    \n",
    "    \n",
    "x = df[['petal width (cm)', 'petal length (cm)']]\n",
    "y = df['target']\n",
    "\n",
    "clf = DecisionTreeClassifier(max_depth=3)\n",
    "clf.fit(x, y)\n",
    "\n",
    "plot_decision_boundary(clf, x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
